package com.frame.jfinal.config;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletContext;

import com.frame.config.DataSourceConfig;
import com.frame.config.DataSourceConfig.Params;
import com.frame.config.ParamsConfig;
import com.frame.jfinal.IRoutes;
import com.frame.jfinal.controller.CommonController;
import com.frame.jfinal.controller.RootController;
import com.frame.jfinal.interceptor.GlobalInterceptor;
import com.frame.jfinal.interceptor.SystemLoginInterceptor;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.log.Log4jLogger;
import com.jfinal.log.Logger;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.DbKit;
import com.jfinal.plugin.activerecord.dialect.Dialect;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.FreeMarkerRender;
import com.jfinal.render.ViewType;
import com.weixin.config.WeiXinConfig;

import freemarker.template.TemplateModelException;

/*******************************************
 * 作用描述：JFinal框架基础配置
 *******************************************
 * @author LRC
 * @createDate 2015-9-11
 * @version v1.0 
 * @updateRecord 格式：时间，作者，修改说明
 *******************************************
 * 
 */
public class SysConfig extends JFinalConfig{

	private Logger log = Log4jLogger.getLogger(SysConfig.class);
	
	public static String ctx = null;
	
	@Override
	public void configConstant(Constants me) {
		//设置开发模式
		me.setDevMode(true);
		//设置默认视图，采用freemarker
		me.setViewType(ViewType.FREE_MARKER);
		//设置全局错误页面跳转
		me.setError401View("/WEB-INF/html/error/error401.html");
		me.setError403View("/WEB-INF/html/error/error403.html");
		me.setError404View("/WEB-INF/html/error/error404.html");
		me.setError500View("/WEB-INF/html/error/error500.html");
	}

	@Override
	public void configRoute(Routes me) {
		//配置请求访问路由
		//加载系统基本路由配置
		me.add("/",RootController.class,"/WEB-INF/html");
		me.add("/common",CommonController.class,"/WEB-INF/html/common");
		
		
		//加载管理员模块路由配置
		MyJFinalConfig config = MyJFinalConfig.getInstance();
		//从配置文件中读取配置类
		String[] clses = config.getValues("RoutesConfig_");
		for(int i=0; i<clses.length; i++){
			IRoutes r = null;
			try {
				//动态创建配置类并执行加载配置的方法
				r = (IRoutes) Class.forName(clses[i]).newInstance();
				r.routeConfig(me);
			} catch (Exception e) {
				e.printStackTrace();
				log.error(clses[0]+"模块加载配置出错："+e.getMessage());
			}
		}
		log.info("JFinal配置--加载访问路由完成!");
	}

	@Override
	public void configPlugin(Plugins me) {
		//配置jfinal插件
		//配置数据源插件
		DataSourceConfig dsConfig = DataSourceConfig.getInstance();
		List<Params> ps = dsConfig.getPs();
		//获取Model配置文件
		ModelCfgXML mcfg = ModelCfgXML.getInstance();
		Map<String,Map<String,Object[]>> mMapping = mcfg.getModelMapping();
		//遍历加载配置
		for(Params p : ps){
			//设置主数据源
			if(p.master){
				//"main"为主数据源
				p.name = DbKit.MAIN_CONFIG_NAME;
			}
			C3p0Plugin cp = new C3p0Plugin(p.url, p.username, p.password);
			//配置驱动
			cp.setDriverClass(p.driver);
			//注册插件
			me.add(cp);
			//配置其他插件
			ActiveRecordPlugin arp = new ActiveRecordPlugin(p.name,cp);
			//注册插件
			me.add(arp);
			//配置方言
			Dialect dialect = p.dialect;
			if(dialect!=null){
				arp.setDialect(dialect);
			}
			
			//设置model映射
			//获取该数据源的配置
			Map<String,Object[]> models = mMapping.get(p.name);
			if(models!=null){
				for(Entry<String, Object[]> e : models.entrySet()){
					String key = e.getKey();
					Object[] os = e.getValue();
					//判断是否有主键key说明
					if(os[0]==null){
						arp.addMapping(key, (Class)os[1]);
					}else{
						arp.addMapping(key, (String)os[0],(Class)os[1]);
					}
				}
			}
			// 配置属性名(字段名)大小写不敏感容器工厂
			//arp.setContainerFactory(new CaseInsensitiveContainerFactory());
		}
		log.info("JFinal配置--加载系统插件完成!");
	}

	@Override
	public void configInterceptor(Interceptors me) {
		//配置拦截器
		me.add(new GlobalInterceptor());
		//配置是否登录验证拦截器
		me.add(new SystemLoginInterceptor());
	}

	@Override
	public void configHandler(Handlers me) {
		//配置处理器
		/**
		 * 注意，Handler会接管应用的所有请求，用于高级应用扩展，否则不建议使用
		 */
	}

	/* (non-Javadoc)
	 * @see com.jfinal.config.JFinalConfig#afterJFinalStart()
	 * 系统启动后回调
	 * 1、完成全景变量的初始化
	 */
	@Override
	public void afterJFinalStart() {
		super.afterJFinalStart();
		//获取上下文
		ServletContext servletContext = JFinal.me().getServletContext(); 
		//添加系统启动后执行的代码
		try {
			//上下文名称  /webMgr
			ctx = servletContext.getContextPath();
			ParamsConfig config = ParamsConfig.getInstance();
			
			//freeMarker注册全局变量 上下文
			FreeMarkerRender.getConfiguration().setSharedVariable("ctx",ctx);
			//平台static资源路径
			FreeMarkerRender.getConfiguration().setSharedVariable("stc",ctx+config.getValue("Static.webPath"));
			//平台frame资源路径
			FreeMarkerRender.getConfiguration().setSharedVariable("frm",ctx+config.getValue("Static.frame"));
			//注册其他公共属性
			FreeMarkerRender.getConfiguration().setSharedVariable("system_title",config.getValue("System.title"));
			FreeMarkerRender.getConfiguration().setSharedVariable("system_name",config.getValue("System.name"));
			
			//注册微信服务
			WeiXinConfig.initWeixinService();
		} catch (TemplateModelException e) {
			e.printStackTrace();
		}
	}
	
	/* (non-Javadoc)
	 * @see com.jfinal.config.JFinalConfig#beforeJFinalStop()
	 * 系统停止前回调
	 */
	@Override
	public void beforeJFinalStop() {
		super.beforeJFinalStop();
		//添加系统停止前执行的代码
		
		
	}
}
